home *** CD-ROM | disk | FTP | other *** search
/ Info-Mac 1992 August / info-mac-1992.iso / Applications (app) / Ray Tracer / find.c < prev    next >
Text File  |  1988-11-15  |  2KB  |  98 lines

  1. #define _MC68881_
  2.  
  3. #include <math.h>
  4. #include "rtd.h"
  5. #include "extern.h"
  6. #include "macros.h"
  7.  
  8. double  findo (m, s) /* finds where a ray inside the ball exits. */
  9. struct mat *m;
  10. struct sphere  *s;
  11. {
  12. /* foops id the rotated position vector. */
  13.     struct vector   foops;
  14.     double  t;
  15.     MTV (foops, (*m), s -> cent);
  16. /* see if it hits the ball (it better)*/
  17.     t = s -> rad * s -> rad - foops.y * foops.y - foops.z * foops.z;
  18.     if (t > 0)
  19.     t = foops.x + sqrt (t);
  20.     else
  21.     t = 0;
  22. /* return how far along the ray you were when you hit */
  23.     return (t);
  24. }
  25.  
  26. double  find (m, s)/* finds whether a ray hits a ball*/
  27. struct mat *m;
  28. struct sphere  *s;
  29. {
  30.     struct vector   foops;
  31.     double  t;
  32.     MTV (foops, (*m), s -> cent);
  33.     t = s -> rad * s -> rad - foops.y * foops.y - foops.z * foops.z;
  34.     if (t > 0)
  35.     t = foops.x - sqrt (t);
  36.     else
  37.     t = 0;
  38.     return (t);
  39. }
  40.  
  41. double  finds (m, s)/* finds if a ball is between a point and a 
  42.             lightsource. Returns how obscuring the ball is */
  43. struct mat *m;
  44. struct sphere  *s;
  45. {
  46.     struct vector   foops;
  47.     double  t;
  48.     MTV (foops, (*m), s -> cent);
  49.     t = s -> rad - sqrt (foops.y * foops.y + foops.z * foops.z);
  50.     if (t > 0)
  51.     t = t / foops.x;
  52.     else
  53.     t = 0;
  54.     return (t);
  55. }
  56.  
  57.  
  58.  
  59.  
  60. double  Shadow (p)/* finds if a point is in a Shadow, or if it is on edge */
  61. struct vector  *p;
  62. {
  63.     struct mat  trans;
  64.     struct sphere   ss;
  65.     struct vector   d;
  66.     int     c,
  67.             i;
  68.     double  l,
  69.             k,
  70.             x,
  71.             y,
  72.             z,
  73.             finds ();
  74.     l = 0.0;
  75.     c = -1;
  76.     SV (d, ls.cent, (*p));
  77.     d.l = LEN (d);
  78.     d.xzl = XZL (d);
  79.     mt (&(d), &trans);
  80.  
  81.     for (i = 0; i < nob; i++) {
  82.     ss.rad = bl[i] -> s.rad;
  83.     SV (ss.cent, bl[i] -> s.cent, (*p));
  84.     if ((k = finds (&trans, &ss)) > l) {
  85.         c = i;
  86.         l = k;
  87.     }
  88.     }
  89.     if (c == -1)
  90.     k = 200.0;
  91.     else {
  92.     k = 1.0 - l / ((ls.rad) / (d.l));
  93.     if (k < 0.0)
  94.         k = 0.0;
  95.     k *= 200.0;
  96.     }
  97.     return (k);
  98. }